﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Controller;
using Interfaces;

namespace Skak2012
{
    public partial class Loading : Form
    {
        private TurneringsSystem control;
        static System.Windows.Forms.Timer minTimer = new System.Windows.Forms.Timer();
        static int alarmTæller;
        static bool slukTimer = false;
        bool databaseforbindelsetjek = false, lokaldataloaded = false, databasedataloaded = false, sammenligndata = false;
        Thread tråd;

        #region Konstruktør
        public Loading()
        {
            InitializeComponent();
            control = new TurneringsSystem();
            tråd = new Thread(TestForbindelse);
            MyTimer(1, true);
            pbLoading.Visible = true;
            MyTimer(100, false);
        }
        #endregion

        #region Metoder
        private void HentData()
        {
            if (lokaldataloaded == false)
            {
                control.HentData();
                lokaldataloaded = true;
                if (this.lblProgress.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(HentData);
                    this.Invoke(d, new object[] { });
                }
                else
                {
                    HentData();
                }
            }
            else
            {
                StartSkærm startSkærmGUI = new StartSkærm(control);
                startSkærmGUI.Show();
                this.Hide();
                tråd.Abort();
                minTimer.Stop();
            }
        }
        #endregion

        #region Timer
        private void MyTimer(int tid, bool load)
        {
            /* Adds the event and the event handler for the method that will 
         process the timer event to the timer. */
            if (sammenligndata == false)
            {
                if (databaseforbindelsetjek == false)
                {
                    if (load == false)
                    {
                        minTimer.Tick += new EventHandler(ProgressBarLoad);
                    }
                    else
                    {
                        minTimer.Tick += new EventHandler(GUILoad);
                    }
                }
                else
                {
                    if (load == false)
                    {
                        minTimer.Tick += new EventHandler(ProgressBarLoadFile);
                    }
                    else
                    {
                        minTimer.Tick += new EventHandler(ProgressBarLoadDatabase);
                    }
                }
            }
            else
            {
                minTimer.Tick += new EventHandler(ProgressBarSammenlignData);
            }

            minTimer.Interval = tid;
            minTimer.Start();

            // Runs the timer, and raises the event.
            while (slukTimer == false)
            {
                Application.DoEvents();
            }
        }

        private void GUILoad(Object sender, EventArgs e)
        {
            minTimer.Stop();
            slukTimer = true;
        }

        private void ProgressBarLoad(Object sender, EventArgs e)
        {
            minTimer.Stop();
            if (alarmTæller == 0)
            {
                tråd.Start();
            }
            alarmTæller += 1;
            try
            {
                pbLoading.Value = (pbLoading.Value + 1);
                minTimer.Enabled = true;
            }
            catch
            {
                if (databaseforbindelsetjek != true)
                {
                    minTimer.Stop();
                    pbLoading.Value = 100;
                    slukTimer = true;
                    tråd.Abort();
                    control.SetDatabaseStatus(false);
                    TestForbindelseFejl();
                }
            }
        }

        private void ProgressBarLoadFile(Object sender, EventArgs e)
        {
            minTimer.Stop();
            if (databaseforbindelsetjek == true)
            {
                alarmTæller = 0;
                databaseforbindelsetjek = false;
            }
            if (alarmTæller == 0)
            {
                tråd = new Thread(HentData);
                tråd.Start();
            }
            alarmTæller += 1;
            try
            {
                pbLoading.Value = (int)(alarmTæller / 2);
                minTimer.Enabled = true;
            }
            catch
            {
                minTimer.Stop();
                pbLoading.Value = 100;
            }
        }

        private void ProgressBarLoadDatabase(Object sender, EventArgs e)
        {
            minTimer.Stop();
            if (databaseforbindelsetjek == true)
            {
                alarmTæller = 0;
                databaseforbindelsetjek = false;
            }
            if (alarmTæller == 0)
            {
                tråd = new Thread(HentDatabase);
                tråd.Start();
            }
            alarmTæller += 1;
            try
            {
                pbLoading.Value = (int)(alarmTæller / 2);
            }
            catch
            {
                pbLoading.Value = 100;
            }
            minTimer.Enabled = true;
        }

        private void ProgressBarSammenlignData(Object sender, EventArgs e)
        {
            minTimer.Stop();
            if (sammenligndata == true)
            {
                alarmTæller = 0;
                sammenligndata = false;
            }
            if (alarmTæller == 0)
            {
                tråd = new Thread(SammenlignData);
                tråd.Start();
            }
            alarmTæller += 1;
            try
            {
                pbLoading.Value = (int)(alarmTæller / 2);
            }
            catch
            {
                pbLoading.Value = 100;
            }
            minTimer.Enabled = true;
        }
        #endregion

        #region Database
        private void TestForbindelse()
        {
            if (control.TestForbindelse() == false)
            {
                TestForbindelseFejl();
            }
            else
            {
                TestForbindelseSucces();
            }
        }

        private void TestForbindelseSucces()
        {
            if (this.lblForbindelse.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(TestForbindelseSucces);
                this.Invoke(d, new object[] { });
            }
            else
            {
                minTimer.Stop();
                tråd.Abort();
                lblForbindelse.Text = "Forbundet til Databasen";
                lblForbindelse.ForeColor = Color.LimeGreen;
                pbLoading.Value = 100;
                control.SetDatabaseStatus(true);
                databaseforbindelsetjek = true;
                lblProgress.Text = "Henter Data fra Databasen";
                slukTimer = true;
                MyTimer(100, true);
            }
        }

        private void TestForbindelseFejl()
        {
            if (this.lblForbindelse.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(TestForbindelseFejl);
                this.Invoke(d, new object[] { });
            }
            else
            {
                lblForbindelse.Text = "Ingen Database Forbindelse";
                lblForbindelse.ForeColor = Color.Tomato;
                pbLoading.Value = 100;
                control.SetDatabaseStatus(false);
                databaseforbindelsetjek = true;
                lblProgress.Text = "Henter Data Lokalt";
                minTimer.Stop();
                tråd.Abort();
                slukTimer = true;
                MyTimer(100, false);
            }
        }

        private void HentDatabase()
        {
            if (databasedataloaded == false)
            {
                control.HentDatabase();
                databasedataloaded = true;
                if (this.lblProgress.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(HentDatabase);
                    this.Invoke(d, new object[] { });
                }
                else
                {
                    HentDatabase();
                }
            }
            else
            {
                sammenligndata = true;
                lblProgress.Text = "Sammenligner med Lokal Data";
                minTimer.Stop();
                tråd.Abort();
                slukTimer = true;
                MyTimer(100, false);
            }
        }

        private void SammenlignData()
        {
            if (lokaldataloaded == false)
            {
                control.SammenlignData();
                control.GemData();
                lokaldataloaded = true;
                if (this.lblProgress.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SammenlignData);
                    this.Invoke(d, new object[] { });
                }
                else
                {
                    SammenlignData();
                }
            }
            else
            {
                tråd.Abort();
                minTimer.Stop();
                StartSkærm startSkærmGUI = new StartSkærm(control);
                startSkærmGUI.Show();
                this.Hide();
            }
        }

        private delegate void SetTextCallback();
        #endregion
    }
}
